<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/pystate.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/pystate.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> 
<a name="2" /><span class="True">       2:</span> <span class="k">/* Thread and interpreter state structures and their interfaces */</span>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> 
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_ref.html#_UHlfUFlTVEFURV9IXzA_"><span class="b">Py_PYSTATE_H</span></a>
<a name="6" /><span class="Maybe">       6:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlfUFlTVEFURV9IXzA_"><span class="b">Py_PYSTATE_H</span></a>
<a name="7" /><span class="False">       7:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="8" /><span class="False">       8:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="f">#</span><span class="n">endif</span>
<a name="10" /><span class="Maybe">      10:</span> 
<a name="11" /><span class="Maybe">      11:</span> <span class="k">/* This limitation is for performance and simplicity. If needed it can be</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="k">removed (with effort). */</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_TUFYX0NPX0VYVFJBX1VTRVJTXzA_"><span class="b">MAX_CO_EXTRA_USERS</span></a> <span class="c">255</span>
<a name="14" /><span class="Maybe">      14:</span> 
<a name="15" /><span class="Maybe">      15:</span> <span class="k">/* State shared between threads */</span>
<a name="16" /><span class="Maybe">      16:</span> 
<a name="17" /><span class="Maybe">      17:</span> <span class="m">struct</span> <span class="b">_ts</span><span class="f">;</span> <span class="k">/* Forward */</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="m">struct</span> <span class="b">_is</span><span class="f">;</span> <span class="k">/* Forward */</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="m">struct</span> <span class="b">_frame</span><span class="f">;</span> <span class="k">/* Forward declaration for PyFrameObject. */</span>
<a name="20" /><span class="Maybe">      20:</span> 
<a name="21" /><span class="False">      21:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">Py_LIMITED_API</span>
<a name="22" /><span class="False">      22:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_is</span> <span class="b">PyInterpreterState</span><span class="f">;</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="f">#</span><span class="n">else</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="m">typedef</span> <span class="b">PyObject</span><span class="f">*</span> <span class="f">(</span><span class="f">*</span><span class="b">_PyFrameEvalFunction</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="25" /><span class="Maybe">      25:</span> 
<a name="26" /><span class="Maybe">      26:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_is</span> <span class="f">{</span>
<a name="27" /><span class="Maybe">      27:</span> 
<a name="28" /><span class="Maybe">      28:</span>     <span class="m">struct</span> <span class="b">_is</span> <span class="f">*</span><span class="b">next</span><span class="f">;</span>
<a name="29" /><span class="Maybe">      29:</span>     <span class="m">struct</span> <span class="b">_ts</span> <span class="f">*</span><span class="b">tstate_head</span><span class="f">;</span>
<a name="30" /><span class="Maybe">      30:</span> 
<a name="31" /><span class="Maybe">      31:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">modules</span><span class="f">;</span>
<a name="32" /><span class="Maybe">      32:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">modules_by_index</span><span class="f">;</span>
<a name="33" /><span class="Maybe">      33:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">sysdict</span><span class="f">;</span>
<a name="34" /><span class="Maybe">      34:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">builtins</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">importlib</span><span class="f">;</span>
<a name="36" /><span class="Maybe">      36:</span> 
<a name="37" /><span class="Maybe">      37:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">codec_search_path</span><span class="f">;</span>
<a name="38" /><span class="Maybe">      38:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">codec_search_cache</span><span class="f">;</span>
<a name="39" /><span class="Maybe">      39:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">codec_error_registry</span><span class="f">;</span>
<a name="40" /><span class="Maybe">      40:</span>     <span class="m">int</span> <span class="b">codecs_initialized</span><span class="f">;</span>
<a name="41" /><span class="Maybe">      41:</span>     <span class="m">int</span> <span class="b">fscodec_initialized</span><span class="f">;</span>
<a name="42" /><span class="Maybe">      42:</span> 
<a name="43" /><span class="Maybe">      43:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="macros_ref.html#_SEFWRV9ETE9QRU5fMA__"><span class="b">HAVE_DLOPEN</span></a>
<a name="44" /><span class="Maybe">      44:</span>     <span class="m">int</span> <span class="b">dlopenflags</span><span class="f">;</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="f">#</span><span class="n">endif</span>
<a name="46" /><span class="Maybe">      46:</span> 
<a name="47" /><span class="Maybe">      47:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">builtins_copy</span><span class="f">;</span>
<a name="48" /><span class="Maybe">      48:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">import_func</span><span class="f">;</span>
<a name="49" /><span class="Maybe">      49:</span>     <span class="k">/* Initialized to PyEval_EvalFrameDefault(). */</span>
<a name="50" /><span class="Maybe">      50:</span>     <span class="b">_PyFrameEvalFunction</span> <span class="b">eval_frame</span><span class="f">;</span>
<a name="51" /><span class="Maybe">      51:</span> <span class="f">}</span> <span class="b">PyInterpreterState</span><span class="f">;</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="f">#</span><span class="n">endif</span>
<a name="53" /><span class="Maybe">      53:</span> 
<a name="54" /><span class="Maybe">      54:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_co_extra_state</span> <span class="f">{</span>
<a name="55" /><span class="Maybe">      55:</span>     <span class="m">struct</span> <span class="b">_co_extra_state</span> <span class="f">*</span><span class="b">next</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span>     <span class="b">PyInterpreterState</span><span class="f">*</span> <span class="b">interp</span><span class="f">;</span>
<a name="57" /><span class="Maybe">      57:</span> 
<a name="58" /><span class="Maybe">      58:</span>     <span class="b">Py_ssize_t</span> <span class="b">co_extra_user_count</span><span class="f">;</span>
<a name="59" /><span class="Maybe">      59:</span>     <span class="b">freefunc</span> <span class="b">co_extra_freefuncs</span><span class="f">[</span><a href="macros_ref.html#_TUFYX0NPX0VYVFJBX1VTRVJTXzA_"><span class="b">MAX_CO_EXTRA_USERS</span></a><span class="f">]</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">}</span> <span class="b">__PyCodeExtraState</span><span class="f">;</span>
<a name="61" /><span class="Maybe">      61:</span> 
<a name="62" /><span class="Maybe">      62:</span> <span class="k">/* This is temporary for backwards compat in 3.6 and will be removed in 3.7 */</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="b">__PyCodeExtraState</span><span class="f">*</span> <span class="b">__PyCodeExtraState_Get</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="64" /><span class="Maybe">      64:</span> 
<a name="65" /><span class="Maybe">      65:</span> <span class="k">/* State unique per thread */</span>
<a name="66" /><span class="Maybe">      66:</span> 
<a name="67" /><span class="Maybe">      67:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="k">/* Py_tracefunc return -1 when raising an exception, or 0 for success. */</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="m">typedef</span> <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">Py_tracefunc</span><span class="f">)</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="70" /><span class="Maybe">      70:</span> 
<a name="71" /><span class="Maybe">      71:</span> <span class="k">/* The following values are used for &apos;what&apos; for tracefunc functions: */</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9DQUxMXzA_"><span class="b">PyTrace_CALL</span></a> <span class="c">0</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9FWENFUFRJT05fMA__"><span class="b">PyTrace_EXCEPTION</span></a> <span class="c">1</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9MSU5FXzA_"><span class="b">PyTrace_LINE</span></a> <span class="c">2</span>
<a name="75" /><span class="Maybe">      75:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9SRVRVUk5fMA__"><span class="b">PyTrace_RETURN</span></a> <span class="c">3</span>
<a name="76" /><span class="Maybe">      76:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9DX0NBTExfMA__"><span class="b">PyTrace_C_CALL</span></a> <span class="c">4</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9DX0VYQ0VQVElPTl8w"><span class="b">PyTrace_C_EXCEPTION</span></a> <span class="c">5</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZV9DX1JFVFVSTl8w"><span class="b">PyTrace_C_RETURN</span></a> <span class="c">6</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="f">#</span><span class="n">endif</span>
<a name="80" /><span class="Maybe">      80:</span> 
<a name="81" /><span class="False">      81:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">Py_LIMITED_API</span>
<a name="82" /><span class="False">      82:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_ts</span> <span class="b">PyThreadState</span><span class="f">;</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="f">#</span><span class="n">else</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_ts</span> <span class="f">{</span>
<a name="85" /><span class="Maybe">      85:</span>     <span class="k">/* See Python/ceval.c for comments explaining most fields */</span>
<a name="86" /><span class="Maybe">      86:</span> 
<a name="87" /><span class="Maybe">      87:</span>     <span class="m">struct</span> <span class="b">_ts</span> <span class="f">*</span><span class="b">prev</span><span class="f">;</span>
<a name="88" /><span class="Maybe">      88:</span>     <span class="m">struct</span> <span class="b">_ts</span> <span class="f">*</span><span class="b">next</span><span class="f">;</span>
<a name="89" /><span class="Maybe">      89:</span>     <span class="b">PyInterpreterState</span> <span class="f">*</span><span class="b">interp</span><span class="f">;</span>
<a name="90" /><span class="Maybe">      90:</span> 
<a name="91" /><span class="Maybe">      91:</span>     <span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="b">frame</span><span class="f">;</span>
<a name="92" /><span class="Maybe">      92:</span>     <span class="m">int</span> <span class="b">recursion_depth</span><span class="f">;</span>
<a name="93" /><span class="Maybe">      93:</span>     <span class="m">char</span> <span class="b">overflowed</span><span class="f">;</span> <span class="k">/* The stack has overflowed. Allow 50 more calls</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k">                        to handle the runtime error. */</span>
<a name="95" /><span class="Maybe">      95:</span>     <span class="m">char</span> <span class="b">recursion_critical</span><span class="f">;</span> <span class="k">/* The current calls must not cause</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="k">                                a stack overflow. */</span>
<a name="97" /><span class="Maybe">      97:</span>     <span class="k">/* &apos;tracing&apos; keeps track of the execution depth when tracing/profiling.</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="k">       This is to prevent the actual trace/profile code from being recorded in</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="k">       the trace/profile. */</span>
<a name="100" /><span class="Maybe">     100:</span>     <span class="m">int</span> <span class="b">tracing</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span>     <span class="m">int</span> <span class="b">use_tracing</span><span class="f">;</span>
<a name="102" /><span class="Maybe">     102:</span> 
<a name="103" /><span class="Maybe">     103:</span>     <span class="b">Py_tracefunc</span> <span class="b">c_profilefunc</span><span class="f">;</span>
<a name="104" /><span class="Maybe">     104:</span>     <span class="b">Py_tracefunc</span> <span class="b">c_tracefunc</span><span class="f">;</span>
<a name="105" /><span class="Maybe">     105:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">c_profileobj</span><span class="f">;</span>
<a name="106" /><span class="Maybe">     106:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">c_traceobj</span><span class="f">;</span>
<a name="107" /><span class="Maybe">     107:</span> 
<a name="108" /><span class="Maybe">     108:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">curexc_type</span><span class="f">;</span>
<a name="109" /><span class="Maybe">     109:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">curexc_value</span><span class="f">;</span>
<a name="110" /><span class="Maybe">     110:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">curexc_traceback</span><span class="f">;</span>
<a name="111" /><span class="Maybe">     111:</span> 
<a name="112" /><span class="Maybe">     112:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">exc_type</span><span class="f">;</span>
<a name="113" /><span class="Maybe">     113:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">exc_value</span><span class="f">;</span>
<a name="114" /><span class="Maybe">     114:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">exc_traceback</span><span class="f">;</span>
<a name="115" /><span class="Maybe">     115:</span> 
<a name="116" /><span class="Maybe">     116:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">dict</span><span class="f">;</span>  <span class="k">/* Stores per-thread state */</span>
<a name="117" /><span class="Maybe">     117:</span> 
<a name="118" /><span class="Maybe">     118:</span>     <span class="m">int</span> <span class="b">gilstate_counter</span><span class="f">;</span>
<a name="119" /><span class="Maybe">     119:</span> 
<a name="120" /><span class="Maybe">     120:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">async_exc</span><span class="f">;</span> <span class="k">/* Asynchronous exception to raise */</span>
<a name="121" /><span class="Maybe">     121:</span>     <span class="m">long</span> <span class="b">thread_id</span><span class="f">;</span> <span class="k">/* Thread id where this tstate was created */</span>
<a name="122" /><span class="Maybe">     122:</span> 
<a name="123" /><span class="Maybe">     123:</span>     <span class="m">int</span> <span class="b">trash_delete_nesting</span><span class="f">;</span>
<a name="124" /><span class="Maybe">     124:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">trash_delete_later</span><span class="f">;</span>
<a name="125" /><span class="Maybe">     125:</span> 
<a name="126" /><span class="Maybe">     126:</span>     <span class="k">/* Called when a thread state is deleted normally, but not when it</span>
<a name="127" /><span class="Maybe">     127:</span> <span class="k">     * is destroyed after fork().</span>
<a name="128" /><span class="Maybe">     128:</span> <span class="k">     * Pain:  to prevent rare but fatal shutdown errors (issue 18808),</span>
<a name="129" /><span class="Maybe">     129:</span> <span class="k">     * Thread.join() must wait for the join&apos;ed thread&apos;s tstate to be unlinked</span>
<a name="130" /><span class="Maybe">     130:</span> <span class="k">     * from the tstate chain.  That happens at the end of a thread&apos;s life,</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="k">     * in pystate.c.</span>
<a name="132" /><span class="Maybe">     132:</span> <span class="k">     * The obvious way doesn&apos;t quite work:  create a lock which the tstate</span>
<a name="133" /><span class="Maybe">     133:</span> <span class="k">     * unlinking code releases, and have Thread.join() wait to acquire that</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="k">     * lock.  The problem is that we _are_ at the end of the thread&apos;s life:</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="k">     * if the thread holds the last reference to the lock, decref&apos;ing the</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="k">     * lock will delete the lock, and that may trigger arbitrary Python code</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="k">     * if there&apos;s a weakref, with a callback, to the lock.  But by this time</span>
<a name="138" /><span class="Maybe">     138:</span> <span class="k">     * _PyThreadState_Current is already NULL, so only the simplest of C code</span>
<a name="139" /><span class="Maybe">     139:</span> <span class="k">     * can be allowed to run (in particular it must not be possible to</span>
<a name="140" /><span class="Maybe">     140:</span> <span class="k">     * release the GIL).</span>
<a name="141" /><span class="Maybe">     141:</span> <span class="k">     * So instead of holding the lock directly, the tstate holds a weakref to</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="k">     * the lock:  that&apos;s the value of on_delete_data below.  Decref&apos;ing a</span>
<a name="143" /><span class="Maybe">     143:</span> <span class="k">     * weakref is harmless.</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="k">     * on_delete points to _threadmodule.c&apos;s static release_sentinel() function.</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="k">     * After the tstate is unlinked, release_sentinel is called with the</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="k">     * weakref-to-lock (on_delete_data) argument, and release_sentinel releases</span>
<a name="147" /><span class="Maybe">     147:</span> <span class="k">     * the indirectly held lock.</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="k">     */</span>
<a name="149" /><span class="Maybe">     149:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">on_delete</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="150" /><span class="Maybe">     150:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">on_delete_data</span><span class="f">;</span>
<a name="151" /><span class="Maybe">     151:</span> 
<a name="152" /><span class="Maybe">     152:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">coroutine_wrapper</span><span class="f">;</span>
<a name="153" /><span class="Maybe">     153:</span>     <span class="m">int</span> <span class="b">in_coroutine_wrapper</span><span class="f">;</span>
<a name="154" /><span class="Maybe">     154:</span> 
<a name="155" /><span class="Maybe">     155:</span>     <span class="k">/* Now used from PyInterpreterState, kept here for ABI</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="k">       compatibility with PyThreadState */</span>
<a name="157" /><span class="Maybe">     157:</span>     <span class="b">Py_ssize_t</span> <span class="b">_preserve_36_ABI_1</span><span class="f">;</span>
<a name="158" /><span class="Maybe">     158:</span>     <span class="b">freefunc</span> <span class="b">_preserve_36_ABI_2</span><span class="f">[</span><a href="macros_ref.html#_TUFYX0NPX0VYVFJBX1VTRVJTXzA_"><span class="b">MAX_CO_EXTRA_USERS</span></a><span class="f">]</span><span class="f">;</span>
<a name="159" /><span class="Maybe">     159:</span> 
<a name="160" /><span class="Maybe">     160:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">async_gen_firstiter</span><span class="f">;</span>
<a name="161" /><span class="Maybe">     161:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">async_gen_finalizer</span><span class="f">;</span>
<a name="162" /><span class="Maybe">     162:</span> 
<a name="163" /><span class="Maybe">     163:</span>     <span class="k">/* XXX signal handlers should also be here */</span>
<a name="164" /><span class="Maybe">     164:</span> 
<a name="165" /><span class="Maybe">     165:</span> <span class="f">}</span> <span class="b">PyThreadState</span><span class="f">;</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="f">#</span><span class="n">endif</span>
<a name="167" /><span class="Maybe">     167:</span> 
<a name="168" /><span class="Maybe">     168:</span> 
<a name="169" /><span class="Maybe">     169:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyInterpreterState_New</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyInterpreterState_Clear</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="171" /><span class="Maybe">     171:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyInterpreterState_Delete</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="172" /><span class="Maybe">     172:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="173" /><span class="Maybe">     173:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_PyState_AddModule</span><span class="f">(</span><span class="b">PyObject</span><span class="f">*</span><span class="f">,</span> <span class="m">struct</span> <span class="b">PyModuleDef</span><span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="174" /><span class="Maybe">     174:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="175" /><span class="Maybe">     175:</span> <span class="f">#</span><span class="n">if</span> <span class="f">!</span><span class="b">defined</span><span class="f">(</span><span class="b">Py_LIMITED_API</span><span class="f">)</span> <span class="f">||</span> <span class="b">Py_LIMITED_API</span><span class="f">+</span><span class="c">0</span> <span class="f">&gt;=</span> <span class="c">0x03030000</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="k">/* New in 3.3 */</span>
<a name="177" /><span class="Maybe">     177:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyState_AddModule</span><span class="f">(</span><span class="b">PyObject</span><span class="f">*</span><span class="f">,</span> <span class="m">struct</span> <span class="b">PyModuleDef</span><span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="178" /><span class="Maybe">     178:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyState_RemoveModule</span><span class="f">(</span><span class="m">struct</span> <span class="b">PyModuleDef</span><span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="179" /><span class="Maybe">     179:</span> <span class="f">#</span><span class="n">endif</span>
<a name="180" /><span class="Maybe">     180:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span><span class="f">*</span><span class="f">)</span> <span class="b">PyState_FindModule</span><span class="f">(</span><span class="m">struct</span> <span class="b">PyModuleDef</span><span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="181" /><span class="Maybe">     181:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="182" /><span class="Maybe">     182:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyState_ClearModules</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="f">#</span><span class="n">endif</span>
<a name="184" /><span class="Maybe">     184:</span> 
<a name="185" /><span class="Maybe">     185:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyThreadState_New</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="186" /><span class="Maybe">     186:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="187" /><span class="Maybe">     187:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyThreadState_Prealloc</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="188" /><span class="Maybe">     188:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyThreadState_Init</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="189" /><span class="Maybe">     189:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="190" /><span class="Maybe">     190:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyThreadState_Clear</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="191" /><span class="Maybe">     191:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyThreadState_Delete</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="192" /><span class="Maybe">     192:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="193" /><span class="Maybe">     193:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyThreadState_DeleteExcept</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="b">tstate</span><span class="f">)</span><span class="f">;</span>
<a name="194" /><span class="Maybe">     194:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="195" /><span class="Maybe">     195:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="macros_ref.html#_V0lUSF9USFJFQURfMA__"><span class="b">WITH_THREAD</span></a>
<a name="196" /><span class="Maybe">     196:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyThreadState_DeleteCurrent</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="197" /><span class="Maybe">     197:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="198" /><span class="Maybe">     198:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyGILState_Reinit</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="199" /><span class="Maybe">     199:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="200" /><span class="Maybe">     200:</span> <span class="f">#</span><span class="n">endif</span>
<a name="201" /><span class="Maybe">     201:</span> 
<a name="202" /><span class="Maybe">     202:</span> <span class="k">/* Return the current thread state. The global interpreter lock must be held.</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="k"> * When the current thread state is NULL, this issues a fatal error (so that</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="k"> * the caller needn&apos;t check for NULL). */</span>
<a name="205" /><span class="Maybe">     205:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyThreadState_Get</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="206" /><span class="Maybe">     206:</span> 
<a name="207" /><span class="Maybe">     207:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="208" /><span class="Maybe">     208:</span> <span class="k">/* Similar to PyThreadState_Get(), but don&apos;t issue a fatal error</span>
<a name="209" /><span class="Maybe">     209:</span> <span class="k"> * if it is NULL. */</span>
<a name="210" /><span class="Maybe">     210:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyThreadState_UncheckedGet</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="211" /><span class="Maybe">     211:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="212" /><span class="Maybe">     212:</span> 
<a name="213" /><span class="Maybe">     213:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyThreadState_Swap</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="214" /><span class="Maybe">     214:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyThreadState_GetDict</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="215" /><span class="Maybe">     215:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyThreadState_SetAsyncExc</span><span class="f">(</span><span class="m">long</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="216" /><span class="Maybe">     216:</span> 
<a name="217" /><span class="Maybe">     217:</span> 
<a name="218" /><span class="Maybe">     218:</span> <span class="k">/* Variable and macro for in-line access to current thread state */</span>
<a name="219" /><span class="Maybe">     219:</span> 
<a name="220" /><span class="Maybe">     220:</span> <span class="k">/* Assuming the current thread holds the GIL, this is the</span>
<a name="221" /><span class="Maybe">     221:</span> <span class="k">   PyThreadState for the current thread. */</span>
<a name="222" /><span class="False">     222:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">Py_BUILD_CORE</span>
<a name="223" /><span class="False">     223:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">_Py_atomic_address</span><span class="f">)</span> <span class="b">_PyThreadState_Current</span><span class="f">;</span>
<a name="224" /><span class="False">     224:</span> <span class="f">#</span>  <span class="n">define</span> <a href="macros_ref.html#_UHlUaHJlYWRTdGF0ZV9HRVRfMA__"><span class="b">PyThreadState_GET</span></a><span class="f">(</span><span class="f">)</span> \
<a name="225" /><span class="False">     225:</span>              <span class="f">(</span><span class="f">(</span><span class="b">PyThreadState</span><span class="f">*</span><span class="f">)</span><span class="b">_Py_atomic_load_relaxed</span><span class="f">(</span><span class="f">&amp;</span><span class="b">_PyThreadState_Current</span><span class="f">)</span><span class="f">)</span>
<a name="226" /><span class="Maybe">     226:</span> <span class="f">#</span><span class="n">else</span>
<a name="227" /><span class="Maybe">     227:</span> <span class="f">#</span>  <span class="n">define</span> <a href="macros_ref.html#_UHlUaHJlYWRTdGF0ZV9HRVRfMA__"><span class="b">PyThreadState_GET</span></a><span class="f">(</span><span class="f">)</span> <span class="b">PyThreadState_Get</span><span class="f">(</span><span class="f">)</span>
<a name="228" /><span class="Maybe">     228:</span> <span class="f">#</span><span class="n">endif</span>
<a name="229" /><span class="Maybe">     229:</span> 
<a name="230" /><span class="Maybe">     230:</span> <span class="m">typedef</span>
<a name="231" /><span class="Maybe">     231:</span>     <span class="m">enum</span> <span class="f">{</span><span class="b">PyGILState_LOCKED</span><span class="f">,</span> <span class="b">PyGILState_UNLOCKED</span><span class="f">}</span>
<a name="232" /><span class="Maybe">     232:</span>         <span class="b">PyGILState_STATE</span><span class="f">;</span>
<a name="233" /><span class="Maybe">     233:</span> 
<a name="234" /><span class="Maybe">     234:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="macros_ref.html#_V0lUSF9USFJFQURfMA__"><span class="b">WITH_THREAD</span></a>
<a name="235" /><span class="Maybe">     235:</span> 
<a name="236" /><span class="Maybe">     236:</span> <span class="k">/* Ensure that the current thread is ready to call the Python</span>
<a name="237" /><span class="Maybe">     237:</span> <span class="k">   C API, regardless of the current state of Python, or of its</span>
<a name="238" /><span class="Maybe">     238:</span> <span class="k">   thread lock.  This may be called as many times as desired</span>
<a name="239" /><span class="Maybe">     239:</span> <span class="k">   by a thread so long as each call is matched with a call to</span>
<a name="240" /><span class="Maybe">     240:</span> <span class="k">   PyGILState_Release().  In general, other thread-state APIs may</span>
<a name="241" /><span class="Maybe">     241:</span> <span class="k">   be used between _Ensure() and _Release() calls, so long as the</span>
<a name="242" /><span class="Maybe">     242:</span> <span class="k">   thread-state is restored to its previous state before the Release().</span>
<a name="243" /><span class="Maybe">     243:</span> <span class="k">   For example, normal use of the Py_BEGIN_ALLOW_THREADS/</span>
<a name="244" /><span class="Maybe">     244:</span> <span class="k">   Py_END_ALLOW_THREADS macros are acceptable.</span>
<a name="245" /><span class="Maybe">     245:</span> <span class="k"></span>
<a name="246" /><span class="Maybe">     246:</span> <span class="k">   The return value is an opaque &quot;handle&quot; to the thread state when</span>
<a name="247" /><span class="Maybe">     247:</span> <span class="k">   PyGILState_Ensure() was called, and must be passed to</span>
<a name="248" /><span class="Maybe">     248:</span> <span class="k">   PyGILState_Release() to ensure Python is left in the same state. Even</span>
<a name="249" /><span class="Maybe">     249:</span> <span class="k">   though recursive calls are allowed, these handles can *not* be shared -</span>
<a name="250" /><span class="Maybe">     250:</span> <span class="k">   each unique call to PyGILState_Ensure must save the handle for its</span>
<a name="251" /><span class="Maybe">     251:</span> <span class="k">   call to PyGILState_Release.</span>
<a name="252" /><span class="Maybe">     252:</span> <span class="k"></span>
<a name="253" /><span class="Maybe">     253:</span> <span class="k">   When the function returns, the current thread will hold the GIL.</span>
<a name="254" /><span class="Maybe">     254:</span> <span class="k"></span>
<a name="255" /><span class="Maybe">     255:</span> <span class="k">   Failure is a fatal error.</span>
<a name="256" /><span class="Maybe">     256:</span> <span class="k">*/</span>
<a name="257" /><span class="Maybe">     257:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyGILState_STATE</span><span class="f">)</span> <span class="b">PyGILState_Ensure</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="258" /><span class="Maybe">     258:</span> 
<a name="259" /><span class="Maybe">     259:</span> <span class="k">/* Release any resources previously acquired.  After this call, Python&apos;s</span>
<a name="260" /><span class="Maybe">     260:</span> <span class="k">   state will be the same as it was prior to the corresponding</span>
<a name="261" /><span class="Maybe">     261:</span> <span class="k">   PyGILState_Ensure() call (but generally this state will be unknown to</span>
<a name="262" /><span class="Maybe">     262:</span> <span class="k">   the caller, hence the use of the GILState API.)</span>
<a name="263" /><span class="Maybe">     263:</span> <span class="k"></span>
<a name="264" /><span class="Maybe">     264:</span> <span class="k">   Every call to PyGILState_Ensure must be matched by a call to</span>
<a name="265" /><span class="Maybe">     265:</span> <span class="k">   PyGILState_Release on the same thread.</span>
<a name="266" /><span class="Maybe">     266:</span> <span class="k">*/</span>
<a name="267" /><span class="Maybe">     267:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">PyGILState_Release</span><span class="f">(</span><span class="b">PyGILState_STATE</span><span class="f">)</span><span class="f">;</span>
<a name="268" /><span class="Maybe">     268:</span> 
<a name="269" /><span class="Maybe">     269:</span> <span class="k">/* Helper/diagnostic function - get the current thread state for</span>
<a name="270" /><span class="Maybe">     270:</span> <span class="k">   this thread.  May return NULL if no GILState API has been used</span>
<a name="271" /><span class="Maybe">     271:</span> <span class="k">   on the current thread.  Note that the main thread always has such a</span>
<a name="272" /><span class="Maybe">     272:</span> <span class="k">   thread-state, even if no auto-thread-state call has been made</span>
<a name="273" /><span class="Maybe">     273:</span> <span class="k">   on the main thread.</span>
<a name="274" /><span class="Maybe">     274:</span> <span class="k">*/</span>
<a name="275" /><span class="Maybe">     275:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyGILState_GetThisThreadState</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="276" /><span class="Maybe">     276:</span> 
<a name="277" /><span class="Maybe">     277:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="278" /><span class="Maybe">     278:</span> <span class="k">/* Issue #26558: Flag to disable PyGILState_Check().</span>
<a name="279" /><span class="Maybe">     279:</span> <span class="k">   If set to non-zero, PyGILState_Check() always return 1. */</span>
<a name="280" /><span class="Maybe">     280:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_PyGILState_check_enabled</span><span class="f">;</span>
<a name="281" /><span class="Maybe">     281:</span> 
<a name="282" /><span class="Maybe">     282:</span> <span class="k">/* Helper/diagnostic function - return 1 if the current thread</span>
<a name="283" /><span class="Maybe">     283:</span> <span class="k">   currently holds the GIL, 0 otherwise.</span>
<a name="284" /><span class="Maybe">     284:</span> <span class="k"></span>
<a name="285" /><span class="Maybe">     285:</span> <span class="k">   The function returns 1 if _PyGILState_check_enabled is non-zero. */</span>
<a name="286" /><span class="Maybe">     286:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyGILState_Check</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="287" /><span class="Maybe">     287:</span> 
<a name="288" /><span class="Maybe">     288:</span> <span class="k">/* Unsafe function to get the single PyInterpreterState used by this process&apos;</span>
<a name="289" /><span class="Maybe">     289:</span> <span class="k">   GILState implementation.</span>
<a name="290" /><span class="Maybe">     290:</span> <span class="k"></span>
<a name="291" /><span class="Maybe">     291:</span> <span class="k">   Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini()</span>
<a name="292" /><span class="Maybe">     292:</span> <span class="k">   is called. */</span>
<a name="293" /><span class="Maybe">     293:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyGILState_GetInterpreterStateUnsafe</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="294" /><span class="Maybe">     294:</span> <span class="f">#</span><span class="n">endif</span>
<a name="295" /><span class="Maybe">     295:</span> 
<a name="296" /><span class="Maybe">     296:</span> <span class="f">#</span><span class="n">endif</span>   <span class="k">/* #ifdef WITH_THREAD */</span>
<a name="297" /><span class="Maybe">     297:</span> 
<a name="298" /><span class="Maybe">     298:</span> <span class="k">/* The implementation of sys._current_frames()  Returns a dict mapping</span>
<a name="299" /><span class="Maybe">     299:</span> <span class="k">   thread id to that thread&apos;s current frame.</span>
<a name="300" /><span class="Maybe">     300:</span> <span class="k">*/</span>
<a name="301" /><span class="Maybe">     301:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="302" /><span class="Maybe">     302:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyThread_CurrentFrames</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="303" /><span class="Maybe">     303:</span> <span class="f">#</span><span class="n">endif</span>
<a name="304" /><span class="Maybe">     304:</span> 
<a name="305" /><span class="Maybe">     305:</span> <span class="k">/* Routines for advanced debuggers, requested by David Beazley.</span>
<a name="306" /><span class="Maybe">     306:</span> <span class="k">   Don&apos;t use unless you know what you are doing! */</span>
<a name="307" /><span class="Maybe">     307:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="308" /><span class="Maybe">     308:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyInterpreterState_Head</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="309" /><span class="Maybe">     309:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyInterpreterState_Next</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="310" /><span class="Maybe">     310:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyInterpreterState_ThreadHead</span><span class="f">(</span><span class="b">PyInterpreterState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="311" /><span class="Maybe">     311:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyThreadState_Next</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="312" /><span class="Maybe">     312:</span> 
<a name="313" /><span class="Maybe">     313:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="f">(</span><span class="f">*</span><span class="b">PyThreadFrameGetter</span><span class="f">)</span><span class="f">(</span><span class="b">PyThreadState</span> <span class="f">*</span><span class="b">self_</span><span class="f">)</span><span class="f">;</span>
<a name="314" /><span class="Maybe">     314:</span> <span class="f">#</span><span class="n">endif</span>
<a name="315" /><span class="Maybe">     315:</span> 
<a name="316" /><span class="Maybe">     316:</span> <span class="k">/* hook for PyEval_GetFrame(), requested for Psyco */</span>
<a name="317" /><span class="Maybe">     317:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="318" /><span class="Maybe">     318:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyThreadFrameGetter</span><span class="f">)</span> <span class="b">_PyThreadState_GetFrame</span><span class="f">;</span>
<a name="319" /><span class="Maybe">     319:</span> <span class="f">#</span><span class="n">endif</span>
<a name="320" /><span class="Maybe">     320:</span> 
<a name="321" /><span class="False">     321:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="322" /><span class="False">     322:</span> <span class="f">}</span>
<a name="323" /><span class="Maybe">     323:</span> <span class="f">#</span><span class="n">endif</span>
<a name="324" /><span class="True">     324:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_PYSTATE_H */</span>
<a name="325" /><span class="True">     325:</span> </pre>
  </body>
</html>
